﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;

namespace ConsoleApp1
{
    /// <summary>
    /// 微信回调返回的XML转换
    /// </summary>
    public sealed class XMLSerilizable
    {
        /// <summary>
        /// XML转换为对象
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="xml"></param>
        /// <returns></returns>
        public static T XMLToObject<T>(string xml) where T : new()
        {
            Dictionary<string, object> table = new Dictionary<string, object>();
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(xml);
            var root = doc.FirstChild;
            if (root != null)
            {
                foreach (XmlNode v in root.ChildNodes)
                {
                    if(v.HasChildNodes)
                    {
                        if (v.ChildNodes.Count == 1)
                        {
                            table.Add(v.Name, GetValue(v));
                        }
                        else
                        {
                            table.Add(v.Name, GetDictionary(v.ChildNodes));
                        }
                    }
                }
            }
            return DicToObject<T>(table);
        }

        /// <summary>  
        /// 字典类型转化为对象  
        /// </summary>
        /// <param name="dic"></param>  
        /// <returns></returns>  
        private static T DicToObject<T>(Dictionary<string, object> dic) where T : new()
        {
            var md = new T();
            DicToObject(md, dic);
            return md;
        }

        /// <summary>
        /// Dictionary填充对象
        /// </summary>
        /// <param name="md"></param>
        /// <param name="dic"></param>
        private static void DicToObject(object md, IDictionary dic)
        {
            foreach (var filed in dic.Keys)
            {
                BindingFlags flag = BindingFlags.Public | BindingFlags.IgnoreCase | BindingFlags.Instance;

                try
                {
                    var propertyInfo = md.GetType().GetProperty(filed + "", flag);
                    if (propertyInfo != null)
                    {
                        Type propertyType = propertyInfo.PropertyType;
                        object? objectValue = null;
                        var value = dic[filed];
                        if (value != null)
                        {
                            if (value is IDictionary)
                            {
                                var dicValue = value as IDictionary;
                                var o = Activator.CreateInstance(propertyType);
                                if (o != null && dicValue != null)
                                {
                                    DicToObject(o, dicValue);
                                }
                                propertyInfo.SetValue(md, o, null);
                            }
                            else
                            {
                                if (!string.IsNullOrEmpty(value.ToString()))
                                {
                                    if (!propertyType.IsGenericType)
                                    {
                                        //非泛型
                                        objectValue = Convert.ChangeType(value, propertyType);
                                    }
                                    else
                                    {
                                        //泛型Nullable<>
                                        Type genericTypeDefinition = propertyInfo.PropertyType.GetGenericTypeDefinition();
                                        if (genericTypeDefinition == typeof(Nullable<>))
                                        {
                                            var conversionType = Nullable.GetUnderlyingType(propertyType);
                                            if (conversionType != null)
                                            {
                                                objectValue = Convert.ChangeType(value, conversionType);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                        propertyInfo.SetValue(md, objectValue, null);
                    }
                }
                catch (Exception e)
                {

                }
            }
            //return md;
        }

        /// <summary>
        /// 获得节点值
        /// </summary>
        /// <param name="node"></param>
        /// <returns></returns>
        private static object GetValue(XmlNode node)
        {
            if (node.NodeType == XmlNodeType.Element)
            {
                if (node.HasChildNodes)
                {
                    // <MsgType><![CDATA[text]]></MsgType> 这种结构 node.ChildNodes.Count==1
                    var childNodes = node.ChildNodes;
                    if (childNodes != null)
                    {
                        if (childNodes.Count == 1)
                        {
                            var childNode0 = childNodes[0];
                            if (childNode0 != null)
                            {
                                if (childNode0.NodeType != XmlNodeType.Element)
                                {
                                    return node.InnerText;
                                }
                            }
                        }
                    }
                }
            }
            return string.Empty;
        }

        public static object GetDictionary(XmlNodeList childNodes)
        {
            Dictionary<string, object> table = new Dictionary<string, object>();
            foreach (XmlNode n in childNodes)
            {
                table.Add(n.Name, GetValue(n));
            }
            return table;
        }

        public static T ParseNestedXml<T>(string xml) where T : class
        {
            try
            {
                using (var reader = new StringReader(xml))
                {
                    var serializer = new XmlSerializer(typeof(T));
                    return (T)serializer.Deserialize(reader);
                }
            }
            catch (InvalidOperationException ex)
            {
                // 处理CDATA或格式异常
                var cleanedXml = xml.Replace("<![CDATA[", "").Replace("]]>", "");
                return ParseNestedXml<T>(cleanedXml);
            }
        }
    }



    /*
    1.回复文本消息
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>
          <FromUserName><![CDATA[fromUser]]></FromUserName>
          <CreateTime>12345678</CreateTime>
          <MsgType><![CDATA[text]]></MsgType>
          <Content><![CDATA[你好]]></Content>
        </xml>
        参数			是否必须	描述
        ToUserName		是			接收方帐号（收到的OpenID）
        FromUserName	是			开发者微信号
        CreateTime		是			消息创建时间 （整型）
        MsgType			是			消息类型，文本为text
        Content			是			回复的消息内容（换行：在content中能够换行，微信客户端就支持换行显示）

        2.回复图片消息
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>
          <FromUserName><![CDATA[fromUser]]></FromUserName>
          <CreateTime>12345678</CreateTime>
          <MsgType><![CDATA[image]]></MsgType>
          <Image>
            <MediaId><![CDATA[media_id]]></MediaId>
          </Image>
        </xml>
        参数			是否必须	说明
        ToUserName		是			接收方帐号（收到的OpenID）
        FromUserName	是			开发者微信号
        CreateTime		是			消息创建时间 （整型）
        MsgType			是			消息类型，图片为image
        MediaId			是			通过素材管理中的接口上传多媒体文件，得到的id。

        3.回复语音消息
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>
          <FromUserName><![CDATA[fromUser]]></FromUserName>
          <CreateTime>12345678</CreateTime>
          <MsgType><![CDATA[voice]]></MsgType>
          <Voice>
            <MediaId><![CDATA[media_id]]></MediaId>
          </Voice>
        </xml>
        参数			是否必须	说明
        ToUserName		是			接收方帐号（收到的OpenID）
        FromUserName	是			开发者微信号
        CreateTime		是			消息创建时间戳 （整型）
        MsgType			是			消息类型，语音为voice
        MediaId			是			通过素材管理中的接口上传多媒体文件，得到的id

        4.回复视频消息
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>
          <FromUserName><![CDATA[fromUser]]></FromUserName>
          <CreateTime>12345678</CreateTime>
          <MsgType><![CDATA[video]]></MsgType>
          <Video>
            <MediaId><![CDATA[media_id]]></MediaId>
            <Title><![CDATA[title]]></Title>
            <Description><![CDATA[description]]></Description>
          </Video>
        </xml>
        参数			是否必须	说明
        ToUserName		是			接收方帐号（收到的OpenID）
        FromUserName	是			开发者微信号
        CreateTime		是			消息创建时间 （整型）
        MsgType			是			消息类型，视频为video
        MediaId			是			通过素材管理中的接口上传多媒体文件，得到的id
        Title			否			视频消息的标题
        Description		否			视频消息的描述

        5.回复音乐消息
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>
          <FromUserName><![CDATA[fromUser]]></FromUserName>
          <CreateTime>12345678</CreateTime>
          <MsgType><![CDATA[music]]></MsgType>
          <Music>
            <Title><![CDATA[TITLE]]></Title>
            <Description><![CDATA[DESCRIPTION]]></Description>
            <MusicUrl><![CDATA[MUSIC_Url]]></MusicUrl>
            <HQMusicUrl><![CDATA[HQ_MUSIC_Url]]></HQMusicUrl>
            <ThumbMediaId><![CDATA[media_id]]></ThumbMediaId>
          </Music>
        </xml>
        参数			是否必须	说明
        ToUserName		是			接收方帐号（收到的OpenID）
        FromUserName	是			开发者微信号
        CreateTime		是			消息创建时间 （整型）
        MsgType			是			消息类型，音乐为music
        Title			否			音乐标题
        Description		否			音乐描述
        MusicURL		否			音乐链接
        HQMusicUrl		否			高质量音乐链接，WIFI环境优先使用该链接播放音乐
        ThumbMediaId	是			缩略图的媒体id，通过素材管理中的接口上传多媒体文件，得到的id

        6.回复图文消息
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>
          <FromUserName><![CDATA[fromUser]]></FromUserName>
          <CreateTime>12345678</CreateTime>
          <MsgType><![CDATA[news]]></MsgType>
          <ArticleCount>1</ArticleCount>
          <Articles>
            <item>
              <Title><![CDATA[title1]]></Title>
              <Description><![CDATA[description1]]></Description>
              <PicUrl><![CDATA[picurl]]></PicUrl>
              <Url><![CDATA[url]]></Url>
            </item>
          </Articles>
        </xml>
        参数			是否必须	说明
        ToUserName		是			接收方帐号（收到的OpenID）
        FromUserName	是			开发者微信号
        CreateTime		是			消息创建时间 （整型）
        MsgType			是			消息类型，图文为news
        ArticleCount	是			图文消息个数；当用户发送文本、图片、语音、视频、图文、地理位置这六种消息时，开发者只能回复1条图文消息；其余场景最多可回复8条图文消息
        Articles		是			图文消息信息，注意，如果图文数超过限制，则将只发限制内的条数
        Title			是			图文消息标题
        Description		是			图文消息描述
        PicUrl			是			图片链接，支持JPG、PNG格式，较好的效果为大图360*200，小图200*200
        Url				是			点击图文消息跳转链接

        消息转发到客服
        如果公众号处于开发模式，普通微信用户向公众号发消息时，微信服务器会先将消息POST到开发者填写的url上，如果希望将消息转发到客服系统，则需要开发者在响应包中返回MsgType为transfer_customer_service的消息，微信服务器收到响应后会把当次发送的消息转发至客服系统。
         <xml> 
          <ToUserName><![CDATA[touser]]></ToUserName>  
          <FromUserName><![CDATA[fromuser]]></FromUserName>  
          <CreateTime>1399197672</CreateTime>  
          <MsgType><![CDATA[transfer_customer_service]]></MsgType> 
        </xml>
        参数说明
        参数			是否必须	描述
        ToUserName		是			接收方帐号（收到的OpenID）
        FromUserName	是			开发者微信号
        CreateTime		是			消息创建时间 （整型）
        MsgType			是			transfer_customer_service

        消息转发到指定客服
        如果您有多个客服人员同时登录了客服并且开启了自动接入在进行接待，每一个客户的消息转发给客服时，多客服系统会将客户分配给其中一个客服人员。如果您希望将某个客户的消息转给指定的客服来接待，可以在返回transfer_customer_service消息时附上TransInfo信息指定一个客服帐号。 需要注意，如果指定的客服没有接入能力(不在线、没有开启自动接入或者自动接入已满)，该用户会被直接接入到指定客服，不再通知其它客服，不会被其他客服接待。建议在指定客服时，先查询客服的接入能力（获取在线客服接待信息接口），指定到有能力接入的客服，保证客户能够及时得到服务。
        示例代码
         <xml> 
          <ToUserName><![CDATA[touser]]></ToUserName>  
          <FromUserName><![CDATA[fromuser]]></FromUserName>  
          <CreateTime>1399197672</CreateTime>  
          <MsgType><![CDATA[transfer_customer_service]]></MsgType>  
          <TransInfo> 
            <KfAccount><![CDATA[test1@test]]></KfAccount> 
          </TransInfo> 
        </xml>
        参数说明
        参数			是否必须	描述
        ToUserName		是			接收方帐号（收到的OpenID）
        FromUserName	是			开发者微信号
        CreateTime		是			消息创建时间 （整型）
        MsgType			是			transfer_customer_service
        KfAccount		是			指定会话接入的客服账号

        文本消息
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>
          <FromUserName><![CDATA[fromUser]]></FromUserName>
          <CreateTime>1348831860</CreateTime>
          <MsgType><![CDATA[text]]></MsgType>
          <Content><![CDATA[this is a test]]></Content>
          <MsgId>1234567890123456</MsgId>
        </xml>
        参数			描述
        ToUserName		开发者微信号
        FromUserName	发送方帐号（一个OpenID）
        CreateTime		消息创建时间 （整型）
        MsgType			消息类型，文本为text
        Content			文本消息内容
        MsgId			消息id，64位整型

        客服消息
        按照上述例子，用户会看到这样的菜单消息：
        “您对本次服务是否满意呢？
        满意
        不满意”
        其中，“满意”和“不满意”是可点击的，当用户点击后，微信会发送一条XML消息到开发者服务器，格式如下：
        <xml>
          <ToUserName><![CDATA[ToUser]]></ToUserName>
          <FromUserName><![CDATA[FromUser]]></FromUserName>
          <CreateTime>1500000000</CreateTime>
          <MsgType><![CDATA[text]]></MsgType>
          <Content><![CDATA[满意]]></Content>
          <MsgId>1234567890123456</MsgId>
          <bizmsgmenuid>101</bizmsgmenuid>
        </xml>
        XML参数说明：
        参数			说明
        ToUserName		开发者帐号
        FromUserName	接收方帐号（OpenID）
        CreateTime		消息创建时间戳
        MsgType			Text
        Content			点击的菜单名
        MsgId			消息ID
        bizmsgmenuid	点击的菜单ID
        收到XML推送之后，开发者可以根据提取出来的bizmsgmenuid和Content识别出微信用户点击的是哪个菜单。 该消息仅支持已认证服务号使用，其余账号类型不允许使用。

        图片消息
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>
          <FromUserName><![CDATA[fromUser]]></FromUserName>
          <CreateTime>1348831860</CreateTime>
          <MsgType><![CDATA[image]]></MsgType>
          <PicUrl><![CDATA[this is a url]]></PicUrl>
          <MediaId><![CDATA[media_id]]></MediaId>
          <MsgId>1234567890123456</MsgId>
        </xml>
        参数			描述
        ToUserName		开发者微信号
        FromUserName	发送方帐号（一个OpenID）
        CreateTime		消息创建时间 （整型）
        MsgType			消息类型，图片为image
        PicUrl			图片链接（由系统生成）
        MediaId			图片消息媒体id，可以调用获取临时素材接口拉取数据。
        MsgId			消息id，64位整型

        语音消息
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>
          <FromUserName><![CDATA[fromUser]]></FromUserName>
          <CreateTime>1357290913</CreateTime>
          <MsgType><![CDATA[voice]]></MsgType>
          <MediaId><![CDATA[media_id]]></MediaId>
          <Format><![CDATA[Format]]></Format>
          <MsgId>1234567890123456</MsgId>
        </xml>
        参数			描述
        ToUserName		开发者微信号
        FromUserName	发送方帐号（一个OpenID）
        CreateTime		消息创建时间 （整型）
        MsgType			语音为voice
        MediaId			语音消息媒体id，可以调用获取临时素材接口拉取数据。
        Format			语音格式，如amr，speex等
        MsgId			消息id，64位整型

        请注意，开通语音识别后，用户每次发送语音给公众号时，微信会在推送的语音消息XML数据包中，增加一个Recognition字段（注：由于客户端缓存，开发者开启或者关闭语音识别功能，对新关注者立刻生效，对已关注用户需要24小时生效。开发者可以重新关注此帐号进行测试）。开启语音识别后的语音XML数据包如下：
        <xml>
          <ToUserName>< ![CDATA[toUser] ]></ToUserName>
          <FromUserName>< ![CDATA[fromUser] ]></FromUserName>
          <CreateTime>1357290913</CreateTime>
          <MsgType>< ![CDATA[voice] ]></MsgType>
          <MediaId>< ![CDATA[media_id] ]></MediaId>
          <Format>< ![CDATA[Format] ]></Format>
          <Recognition>< ![CDATA[腾讯微信团队] ]></Recognition>
          <MsgId>1234567890123456</MsgId>
        </xml>
        参数说明：
        参数			描述
        ToUserName		开发者微信号
        FromUserName	发送方帐号（一个OpenID）
        CreateTime		消息创建时间 （整型）
        MsgType			语音为voice
        MediaId			语音消息媒体id，可以调用获取临时素材接口拉取该媒体
        Format			语音格式：amr
        Recognition		语音识别结果，UTF8编码
        MsgId			消息id，64位整型

        视频消息
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>
          <FromUserName><![CDATA[fromUser]]></FromUserName>
          <CreateTime>1357290913</CreateTime>
          <MsgType><![CDATA[video]]></MsgType>
          <MediaId><![CDATA[media_id]]></MediaId>
          <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
          <MsgId>1234567890123456</MsgId>
        </xml>
        参数			描述
        ToUserName		开发者微信号
        FromUserName	发送方帐号（一个OpenID）
        CreateTime		消息创建时间 （整型）
        MsgType			视频为video
        MediaId			视频消息媒体id，可以调用获取临时素材接口拉取数据。
        ThumbMediaId	视频消息缩略图的媒体id，可以调用多媒体文件下载接口拉取数据。
        MsgId	消息id，64位整型

        小视频消息
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>
          <FromUserName><![CDATA[fromUser]]></FromUserName>
          <CreateTime>1357290913</CreateTime>
          <MsgType><![CDATA[shortvideo]]></MsgType>
          <MediaId><![CDATA[media_id]]></MediaId>
          <ThumbMediaId><![CDATA[thumb_media_id]]></ThumbMediaId>
          <MsgId>1234567890123456</MsgId>
        </xml>
        参数			描述
        ToUserName		开发者微信号
        FromUserName	发送方帐号（一个OpenID）
        CreateTime		消息创建时间 （整型）
        MsgType			小视频为shortvideo
        MediaId			视频消息媒体id，可以调用获取临时素材接口拉取数据。
        ThumbMediaId	视频消息缩略图的媒体id，可以调用获取临时素材接口拉取数据。
        MsgId			消息id，64位整型

        地理位置消息
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>
          <FromUserName><![CDATA[fromUser]]></FromUserName>
          <CreateTime>1351776360</CreateTime>
          <MsgType><![CDATA[location]]></MsgType>
          <Location_X>23.134521</Location_X>
          <Location_Y>113.358803</Location_Y>
          <Scale>20</Scale>
          <Label><![CDATA[位置信息]]></Label>
          <MsgId>1234567890123456</MsgId>
        </xml>
        参数			描述
        ToUserName		开发者微信号
        FromUserName	发送方帐号（一个OpenID）
        CreateTime		消息创建时间 （整型）
        MsgType			消息类型，地理位置为location
        Location_X		地理位置纬度
        Location_Y		地理位置经度
        Scale			地图缩放大小
        Label			地理位置信息
        MsgId			消息id，64位整型

        链接消息
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>
          <FromUserName><![CDATA[fromUser]]></FromUserName>
          <CreateTime>1351776360</CreateTime>
          <MsgType><![CDATA[link]]></MsgType>
          <Title><![CDATA[公众平台官网链接]]></Title>
          <Description><![CDATA[公众平台官网链接]]></Description>
          <Url><![CDATA[url]]></Url>
          <MsgId>1234567890123456</MsgId>
        </xml>
        参数			描述
        ToUserName		接收方微信号
        FromUserName	发送方微信号，若为普通用户，则是一个OpenID
        CreateTime		消息创建时间
        MsgType			消息类型，链接为link
        Title			消息标题
        Description		消息描述
        Url				消息链接
        MsgId			消息id，64位整型

        1.关注/取消关注事件
        用户在关注与取消关注公众号时，微信会把这个事件推送到开发者填写的URL。方便开发者给用户下发欢迎消息或者做帐号的解绑。为保护用户数据隐私，开发者收到用户取消关注事件时需要删除该用户的所有信息。
        微信服务器在五秒内收不到响应会断掉连接，并且重新发起请求，总共重试三次。
        关于重试的消息排重，推荐使用FromUserName + CreateTime 排重。
        假如服务器无法保证在五秒内处理并回复，可以直接回复空串，微信服务器不会对此作任何处理，并且不会发起重试。
        推送XML数据包示例：
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>
          <FromUserName><![CDATA[FromUser]]></FromUserName>
          <CreateTime>123456789</CreateTime>
          <MsgType><![CDATA[event]]></MsgType>
          <Event><![CDATA[subscribe]]></Event>
        </xml>
        参数说明：
        参数			描述
        ToUserName		开发者微信号
        FromUserName	发送方帐号（一个OpenID）
        CreateTime		消息创建时间 （整型）
        MsgType			消息类型，event
        Event			事件类型，subscribe(订阅)、unsubscribe(取消订阅)

        2.扫描带参数二维码事件
        用户扫描带场景值二维码时，可能推送以下两种事件：
        如果用户还未关注公众号，则用户可以关注公众号，关注后微信会将带场景值关注事件推送给开发者。
        如果用户已经关注公众号，则微信会将带场景值扫描事件推送给开发者。
        2.1. 用户未关注时，进行关注后的事件推送
        推送XML数据包示例：
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>
          <FromUserName><![CDATA[FromUser]]></FromUserName>
          <CreateTime>123456789</CreateTime>
          <MsgType><![CDATA[event]]></MsgType>
          <Event><![CDATA[subscribe]]></Event>
          <EventKey><![CDATA[qrscene_123123]]></EventKey>
          <Ticket><![CDATA[TICKET]]></Ticket>
        </xml>
        参数说明：
        参数			描述
        ToUserName		开发者微信号
        FromUserName	发送方帐号（一个OpenID）
        CreateTime		消息创建时间 （整型）
        MsgType			消息类型，event
        Event			事件类型，subscribe
        EventKey		事件KEY值，qrscene_为前缀，后面为二维码的参数值
        Ticket			二维码的ticket，可用来换取二维码图片

        2.2. 用户已关注时的事件推送
        推送XML数据包示例：
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>
          <FromUserName><![CDATA[FromUser]]></FromUserName>
          <CreateTime>123456789</CreateTime>
          <MsgType><![CDATA[event]]></MsgType>
          <Event><![CDATA[SCAN]]></Event>
          <EventKey><![CDATA[SCENE_VALUE]]></EventKey>
          <Ticket><![CDATA[TICKET]]></Ticket>
        </xml> 
        参数说明：
        参数			描述
        ToUserName		开发者微信号
        FromUserName	发送方帐号（一个OpenID）
        CreateTime		消息创建时间 （整型）
        MsgType			消息类型，event
        Event			事件类型，SCAN
        EventKey		事件KEY值，是一个32位无符号整数，即创建二维码时的二维码scene_id
        Ticket			二维码的ticket，可用来换取二维码图片

        3.上报地理位置事件
        用户同意上报地理位置后，每次进入公众号会话时，都会在进入时上报地理位置，或在进入会话后每5秒上报一次地理位置，公众号可以在公众平台网站中修改以上设置。上报地理位置时，微信会将上报地理位置事件推送到开发者填写的URL。
        推送XML数据包示例：
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>
          <FromUserName><![CDATA[fromUser]]></FromUserName>
          <CreateTime>123456789</CreateTime>
          <MsgType><![CDATA[event]]></MsgType>
          <Event><![CDATA[LOCATION]]></Event>
          <Latitude>23.137466</Latitude>
          <Longitude>113.352425</Longitude>
          <Precision>119.385040</Precision>
        </xml>
        参数说明：
        参数			描述
        ToUserName		开发者微信号
        FromUserName	发送方帐号（一个OpenID）
        CreateTime		消息创建时间 （整型）
        MsgType			消息类型，event
        Event			事件类型，LOCATION
        Latitude		地理位置纬度
        Longitude		地理位置经度
        Precision		地理位置精度

        4.自定义菜单事件
        用户点击自定义菜单后，微信会把点击事件推送给开发者，请注意，点击菜单弹出子菜单，不会产生上报。
        4.1点击菜单拉取消息时的事件推送
        推送XML数据包示例：
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>
          <FromUserName><![CDATA[FromUser]]></FromUserName>
          <CreateTime>123456789</CreateTime>
          <MsgType><![CDATA[event]]></MsgType>
          <Event><![CDATA[CLICK]]></Event>
          <EventKey><![CDATA[EVENTKEY]]></EventKey>
        </xml>
        参数说明：
        参数			描述
        ToUserName		开发者微信号
        FromUserName	发送方帐号（一个OpenID）
        CreateTime		消息创建时间 （整型）
        MsgType			消息类型，event
        Event			事件类型，CLICK
        EventKey		事件KEY值，与自定义菜单接口中KEY值对应

        4.2点击菜单跳转链接时的事件推送
        推送XML数据包示例：
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>
          <FromUserName><![CDATA[FromUser]]></FromUserName>
          <CreateTime>123456789</CreateTime>
          <MsgType><![CDATA[event]]></MsgType>
          <Event><![CDATA[VIEW]]></Event>
          <EventKey><![CDATA[www.qq.com]]></EventKey>
          <MenuId>MENUID</MenuId>
        </xml>
        参数说明：
        参数			描述
        ToUserName		开发者微信号
        FromUserName	发送方帐号（一个OpenID）
        CreateTime		消息创建时间 （整型）
        MsgType			消息类型，event
        Event			事件类型，VIEW
        EventKey		事件KEY值，设置的跳转URL
        MenuID			指菜单ID，如果是个性化菜单，则可以通过这个字段，知道是哪个规则的菜单被点击了。

        scancode_push：扫码推事件的事件推送
        推送XML数据包示例：

        <xml>
          <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
          <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
          <CreateTime>1408090502</CreateTime>
          <MsgType><![CDATA[event]]></MsgType>
          <Event><![CDATA[scancode_push]]></Event>
          <EventKey><![CDATA[6]]></EventKey>
          <ScanCodeInfo>
            <ScanType><![CDATA[qrcode]]></ScanType>
            <ScanResult><![CDATA[1]]></ScanResult>
          </ScanCodeInfo>
        </xml>
        参数说明：
        参数			描述
        ToUserName		开发者 微信号
        FromUserName	发送方帐号（一个OpenID）
        CreateTime		消息创建时间（整型）
        MsgType			消息类型，event
        Event			事件类型，scancode_push
        EventKey		事件KEY值，由开发者在创建菜单时设定
        ScanCodeInfo	扫描信息
        ScanType		扫描类型，一般是qrcode
        ScanResult		扫描结果，即二维码对应的字符串信息

        scancode_waitmsg：扫码推事件且弹出“消息接收中”提示框的事件推送
        推送XML数据包示例：

        <xml>
          <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
          <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
          <CreateTime>1408090606</CreateTime>
          <MsgType><![CDATA[event]]></MsgType>
          <Event><![CDATA[scancode_waitmsg]]></Event>
          <EventKey><![CDATA[6]]></EventKey>
          <ScanCodeInfo>
            <ScanType><![CDATA[qrcode]]></ScanType>
            <ScanResult><![CDATA[2]]></ScanResult>
          </ScanCodeInfo>
        </xml>
        参数说明：
        参数			描述
        ToUserName		开发者 微信号
        FromUserName	发送方帐号（一个OpenID）
        CreateTime		消息创建时间 （整型）
        MsgType			消息类型，event
        Event			事件类型，scancode_waitmsg
        EventKey		事件KEY值，由开发者在创建菜单时设定
        ScanCodeInfo	扫描信息
        ScanType		扫描类型，一般是qrcode
        ScanResult		扫描结果，即二维码对应的字符串信息

        pic_sysphoto：弹出系统拍照发图的事件推送
        推送XML数据包示例：
        <xml>
          <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
          <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
          <CreateTime>1408090651</CreateTime>
          <MsgType><![CDATA[event]]></MsgType>
          <Event><![CDATA[pic_sysphoto]]></Event>
          <EventKey><![CDATA[6]]></EventKey>
          <SendPicsInfo>
            <Count>1</Count>
            <PicList>
	          <item>
	            <PicMd5Sum><![CDATA[1b5f7c23b5bf75682a53e7b6d163e185]]></PicMd5Sum>
	          </item>
            </PicList>
          </SendPicsInfo>
        </xml>
        参数说明：
        参数			描述
        ToUserName		开发者 微信号
        FromUserName	发送方帐号（一个OpenID）
        CreateTime		消息创建时间 （整型）
        MsgType			消息类型，event
        Event			事件类型，pic_sysphoto
        EventKey		事件KEY值，由开发者在创建菜单时设定
        SendPicsInfo	发送的图片信息
        Count			发送的图片数量
        PicList			图片列表
        PicMd5Sum		图片的MD5值，开发者若需要，可用于验证接收到图片

        pic_photo_or_album：弹出拍照或者相册发图的事件推送
        推送XML数据包示例：
        <xml>
          <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
          <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
          <CreateTime>1408090816</CreateTime>
          <MsgType><![CDATA[event]]></MsgType>
          <Event><![CDATA[pic_photo_or_album]]></Event>
          <EventKey><![CDATA[6]]></EventKey>
          <SendPicsInfo>
            <Count>1</Count>
	        <PicList>
	          <item>
	            <PicMd5Sum><![CDATA[5a75aaca956d97be686719218f275c6b]]></PicMd5Sum>
	          </item>
            </PicList>
          </SendPicsInfo>
        </xml>
        参数说明：
        参数			描述
        ToUserName		开发者 微信号
        FromUserName	发送方帐号（一个OpenID）
        CreateTime		消息创建时间 （整型）
        MsgType			消息类型，event
        Event			事件类型，pic_photo_or_album
        EventKey		事件KEY值，由开发者在创建菜单时设定
        SendPicsInfo	发送的图片信息
        Count			发送的图片数量
        PicList			图片列表
        PicMd5Sum		图片的MD5值，开发者若需要，可用于验证接收到图片

        pic_weixin：弹出微信相册发图器的事件推送
        推送XML数据包示例：
        <xml>
          <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
          <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
          <CreateTime>1408090816</CreateTime>
          <MsgType><![CDATA[event]]></MsgType>
          <Event><![CDATA[pic_weixin]]></Event>
          <EventKey><![CDATA[6]]></EventKey>
          <SendPicsInfo>
            <Count>1</Count>
	        <PicList>
	          <item>
	            <PicMd5Sum><![CDATA[5a75aaca956d97be686719218f275c6b]]></PicMd5Sum>
	          </item>
	        </PicList>
          </SendPicsInfo>
        </xml>
        参数说明：
        参数			描述
        ToUserName		开发者 微信号
        FromUserName	发送方帐号（一个OpenID）
        CreateTime		消息创建时间 （整型）
        MsgType			消息类型，event
        Event			事件类型，pic_weixin
        EventKey		事件KEY值，由开发者在创建菜单时设定
        SendPicsInfo	发送的图片信息
        Count			发送的图片数量
        PicList			图片列表
        PicMd5Sum		图片的MD5值，开发者若需要，可用于验证接收到图片

        location_select：弹出地理位置选择器的事件推送
        推送XML数据包示例：
        <xml>
          <ToUserName><![CDATA[gh_e136c6e50636]]></ToUserName>
          <FromUserName><![CDATA[oMgHVjngRipVsoxg6TuX3vz6glDg]]></FromUserName>
          <CreateTime>1408091189</CreateTime>
          <MsgType><![CDATA[event]]></MsgType>
          <Event><![CDATA[location_select]]></Event>
          <EventKey><![CDATA[6]]></EventKey>
          <SendLocationInfo>
            <Location_X><![CDATA[23]]></Location_X>
            <Location_Y><![CDATA[113]]></Location_Y>
            <Scale><![CDATA[15]]></Scale>
            <Label><![CDATA[ 广州市海珠区客村艺苑路 106号]]></Label>
            <Poiname><![CDATA[]]></Poiname>
          </SendLocationInfo>
        </xml>
        参数说明：
        参数				描述
        ToUserName			开发者 微信号
        FromUserName		发送方帐号（一个OpenID）
        CreateTime			消息创建时间 （整型）
        MsgType				消息类型，event
        Event				事件类型，location_select
        EventKey			事件KEY值，由开发者在创建菜单时设定
        SendLocationInfo	发送的位置信息
        Location_X			X坐标信息
        Location_Y			Y坐标信息
        Scale				精度，可理解为精度或者比例尺、越精细的话 scale越高
        Label				地理位置的字符串信息
        Poiname				朋友圈POI的名字，可能为空

        点击菜单跳转小程序的事件推送
        推送XML数据包示例：
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>
          <FromUserName><![CDATA[FromUser]]></FromUserName>
          <CreateTime>123456789</CreateTime>
          <MsgType><![CDATA[event]]></MsgType>
          <Event><![CDATA[view_miniprogram]]></Event>
          <EventKey><![CDATA[pages/index/index]]></EventKey>
          <MenuId>MENUID</MenuId>
        </xml>
        参数说明：
        参数				描述
        ToUserName			开发者 微信号
        FromUserName		发送方帐号（一个OpenID）
        CreateTime			消息创建时间 （整型）
        MsgType				消息类型，event
        Event				事件类型，view_miniprogram
        EventKey			事件KEY值，跳转的小程序路径
        MenuID				菜单ID，如果是个性化菜单，则可以通过这个字段，知道是哪个规则的菜单被点击了

        事件推送
        在模版消息发送任务完成后，微信服务器会将是否送达成功作为通知，发送到开发者中心中填写的服务器配置地址中。
        1、送达成功时，推送的XML如下：
        <xml> 
          <ToUserName><![CDATA[gh_7f083739789a]]></ToUserName>  
          <FromUserName><![CDATA[oia2TjuEGTNoeX76QEjQNrcURxG8]]></FromUserName>  
          <CreateTime>1395658920</CreateTime>  
          <MsgType><![CDATA[event]]></MsgType>  
          <Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event>  
          <MsgID>200163836</MsgID>  
          <Status><![CDATA[success]]></Status> 
        </xml>
        参数说明
        参数			说明
        ToUserName		公众号微信号
        FromUserName	接收模板消息的用户的openid
        CreateTime		创建时间
        MsgType			消息类型是事件
        Event			事件为模板消息发送结束
        MsgID			消息id
        Status			发送状态为成功

        2、送达由于用户拒收（用户设置拒绝接收公众号消息）而失败时，推送的XML如下：
        <xml> 
          <ToUserName><![CDATA[gh_7f083739789a]]></ToUserName>  
          <FromUserName><![CDATA[oia2TjuEGTNoeX76QEjQNrcURxG8]]></FromUserName>  
          <CreateTime>1395658984</CreateTime>  
          <MsgType><![CDATA[event]]></MsgType>  
          <Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event>  
          <MsgID>200163840</MsgID>  
          <Status><![CDATA[failed:user block]]></Status> 
        </xml>
        参数说明
        参数			说明
        ToUserName		公众号微信号
        FromUserName	接收模板消息的用户的openid
        CreateTime		创建时间
        MsgType			消息类型是事件
        Event			事件为模板消息发送结束
        MsgID			消息id
        Status			发送状态为用户拒绝接收

        3、送达由于其他原因失败时，推送的XML如下：
         <xml> 
          <ToUserName><![CDATA[gh_7f083739789a]]></ToUserName>  
          <FromUserName><![CDATA[oia2TjuEGTNoeX76QEjQNrcURxG8]]></FromUserName>  
          <CreateTime>1395658984</CreateTime>  
          <MsgType><![CDATA[event]]></MsgType>  
          <Event><![CDATA[TEMPLATESENDJOBFINISH]]></Event>  
          <MsgID>200163840</MsgID>  
          <Status><![CDATA[failed: system failed]]></Status> 
        </xml>
        参数说明
        参数			说明
        ToUserName		公众号微信号
        FromUserName	接收模板消息的用户的openid
        CreateTime		创建时间
        MsgType			消息类型是事件
        Event			事件为模板消息发送结束
        MsgID			消息id
        Status			发送状态为发送失败（非用户拒绝）

        事件推送群发结果
        由于群发任务提交后，群发任务可能在一定时间后才完成，因此，群发接口调用时，仅会给出群发任务是否提交成功的提示，若群发任务提交成功，则在群发任务结束时，会向开发者在公众平台填写的开发者URL（callback URL）推送事件。
        需要注意，由于群发任务彻底完成需要较长时间，将会在群发任务即将完成的时候，就推送群发结果，此时的推送人数数据将会与实际情形存在一定误差
        推送的XML结构如下（发送成功时），已增加原创校验结果和群发图文的url：
        <xml> 
          <ToUserName><![CDATA[gh_4d00ed8d6399]]></ToUserName>  
          <FromUserName><![CDATA[oV5CrjpxgaGXNHIQigzNlgLTnwic]]></FromUserName>  
          <CreateTime>1481013459</CreateTime>  
          <MsgType><![CDATA[event]]></MsgType>  
          <Event><![CDATA[MASSSENDJOBFINISH]]></Event>  
          <MsgID>1000001625</MsgID>  
          <Status><![CDATA[err(30003)]]></Status>  
          <TotalCount>0</TotalCount>  
          <FilterCount>0</FilterCount>  
          <SentCount>0</SentCount>  
          <ErrorCount>0</ErrorCount>  
          <CopyrightCheckResult> 
            <Count>2</Count>  
            <ResultList> 
              <item> 
                <ArticleIdx>1</ArticleIdx>  
                <UserDeclareState>0</UserDeclareState>  
                <AuditState>2</AuditState>  
                <OriginalArticleUrl><![CDATA[Url_1]]></OriginalArticleUrl>  
                <OriginalArticleType>1</OriginalArticleType>  
                <CanReprint>1</CanReprint>  
                <NeedReplaceContent>1</NeedReplaceContent>  
                <NeedShowReprintSource>1</NeedShowReprintSource> 
              </item>  
              <item> 
                <ArticleIdx>2</ArticleIdx>  
                <UserDeclareState>0</UserDeclareState>  
                <AuditState>2</AuditState>  
                <OriginalArticleUrl><![CDATA[Url_2]]></OriginalArticleUrl>  
                <OriginalArticleType>1</OriginalArticleType>  
                <CanReprint>1</CanReprint>  
                <NeedReplaceContent>1</NeedReplaceContent>  
                <NeedShowReprintSource>1</NeedShowReprintSource> 
              </item> 
            </ResultList>  
            <CheckState>2</CheckState> 
          </CopyrightCheckResult> 
          <ArticleUrlResult>
             <Count>1</Count>
             <ResultList>
               <item>
                 <ArticleIdx>1</ArticleIdx>
                 <ArticleUrl><![CDATA[Url]]></ArticleUrl>
               </item>
             </ResultList>
          </ArticleUrlResult>
        </xml>
        参数					说明
        ToUserName				公众号的微信号
        FromUserName			公众号群发助手的微信号，为mphelper
        CreateTime				创建时间的时间戳
        MsgType					消息类型，此处为event
        Event					事件信息，此处为MASSSENDJOBFINISH
        MsgID					群发的消息ID
        Status					群发的结果，为“send success”或“send fail”或“err(num)”。但send success时，也有可能因用户拒收公众号的消息、系统错误等原因造成少量用户接收失败。err(num)是审核失败的具体原因，可能的情况如下：err(10001):涉嫌广告, err(20001):涉嫌政治, err(20004):涉嫌社会, err(20002):涉嫌色情, err(20006):涉嫌违法犯罪, err(20008):涉嫌欺诈, err(20013):涉嫌版权, err(22000):涉嫌互推(互相宣传), err(21000):涉嫌其他, err(30001):原创校验出现系统错误且用户选择了被判为转载就不群发, err(30002): 原创校验被判定为不能群发, err(30003): 原创校验被判定为转载文且用户选择了被判为转载就不群发, err(40001)：管理员拒绝, err(40002)：管理员30分钟内无响应，超时
        TotalCount				tag_id下粉丝数；或者openid_list中的粉丝数
        FilterCount				过滤（过滤是指特定地区、性别的过滤、用户设置拒收的过滤，用户接收已超4条的过滤）后，准备发送的粉丝数，原则上，FilterCount 约等于 SentCount + ErrorCount
        SentCount				发送成功的粉丝数
        ErrorCount				发送失败的粉丝数
        ResultList				各个单图文校验结果
        ArticleIdx				群发文章的序号，从1开始
        UserDeclareState		用户声明文章的状态
        AuditState				系统校验的状态
        OriginalArticleUrl		相似原创文的url
        OriginalArticleType		相似原创文的类型
        CanReprint				是否能转载
        NeedReplaceContent		是否需要替换成原创文内容
        NeedShowReprintSource	是否需要注明转载来源
        CheckState				整体校验结果
        CheckState				1-未被判为转载，可以群发，2-被判为转载，可以群发，3-被判为转载，不能群发
        ArticleUrl				群发文章的url

        事件推送
        用户操作订阅通知弹窗
        场景：用户在图文等场景内订阅通知的操作
        参数					描述
        ToUserName				公众号微信号
        FromUserName			用户 openid
        CreateTime				时间戳
        TemplateId				模板 id（一次订阅可能有多条通知，带有多个 id）
        SubscribeStatusString	用户点击行为（同意、取消发送通知）
        PopupScene				场景

        SubscribeStatusString的合法值
        值			说明
        accept		用户点击“同意”
        reject		用户点击“取消”
        PopupScene	的合法值

        值	说明
        1	弹窗来自 H5 页面
        2	弹窗来自图文消息
        XML 示例
        <xml>
            <ToUserName><![CDATA[gh_123456789abc]]></ToUserName>
            <FromUserName><![CDATA[otFpruAK8D-E6EfStSYonYSBZ8_4]]></FromUserName>
            <CreateTime>1610969440</CreateTime>
            <MsgType><![CDATA[event]]></MsgType>
            <Event><![CDATA[subscribe_msg_popup_event]]></Event>
            <SubscribeMsgPopupEvent>
                <List>
                    <TemplateId><![CDATA[VRR0UEO9VJOLs0MHlU0OilqX6MVFDwH3_3gz3Oc0NIc]]></TemplateId>
                    <SubscribeStatusString><![CDATA[accept]]></SubscribeStatusString>
                    <PopupScene>2</PopupScene>
                </List>
                <List>
                    <TemplateId><![CDATA[9nLIlbOQZC5Y89AZteFEux3WCXRRRG5Wfzkpssu4bLI]]></TemplateId>
                    <SubscribeStatusString><![CDATA[reject]]></SubscribeStatusString>
                    <PopupScene>2</PopupScene>
                </List>
            </SubscribeMsgPopupEvent>
        </xml>

        用户管理订阅通知
        场景：用户在服务通知管理页面做通知管理时的操作

        参数					描述
        ToUserName				公众号微信号
        FromUserName			用户 openid
        CreateTime				时间戳
        TemplateId				模板 id（一次订阅可能有多条通知，带有多个 id）
        SubscribeStatusString	用户点击行为（仅推送用户拒收通知）

        SubscribeStatusString的合法值
        值		说明
        reject	用户点击“取消”
        XML 示例
        <xml>
            <ToUserName><![CDATA[gh_123456789abc]]></ToUserName>
            <FromUserName><![CDATA[otFpruAK8D-E6EfStSYonYSBZ8_4]]></FromUserName>
            <CreateTime>1610969440</CreateTime>
            <MsgType><![CDATA[event]]></MsgType>
            <Event><![CDATA[subscribe_msg_change_event]]></Event>
            <SubscribeMsgChangeEvent>
                <List>
                    <TemplateId><![CDATA[VRR0UEO9VJOLs0MHlU0OilqX6MVFDwH3_3gz3Oc0NIc]]></TemplateId>
                    <SubscribeStatusString><![CDATA[reject]]></SubscribeStatusString>
                </List>
            </SubscribeMsgChangeEvent>
        </xml>

        发送订阅通知
        场景：调用 bizsend 接口发送通知
        参数			描述
        ToUserName		公众号微信号
        FromUserName	用户 openid
        CreateTime		时间戳
        TemplateId		模板 id（一次订阅可能有多条通知，带有多个 id）
        MsgID			消息 id
        ErrorCode		推送结果状态码（0表示成功）
        ErrorStatus		推送结果状态码文字含义
        *失败仅包含因异步推送导致的系统失败
        XML 示例
        <xml>
            <ToUserName><![CDATA[gh_123456789abc]]></ToUserName>
            <FromUserName><![CDATA[otFpruAK8D-E6EfStSYonYSBZ8_4]]></FromUserName>
            <CreateTime>1610969468</CreateTime>
            <MsgType><![CDATA[event]]></MsgType>
            <Event><![CDATA[subscribe_msg_sent_event]]></Event>
            <SubscribeMsgSentEvent>
                <List>
                    <TemplateId><![CDATA[VRR0UEO9VJOLs0MHlU0OilqX6MVFDwH3_3gz3Oc0NIc]]></TemplateId>
                    <MsgID>1700827132819554304</MsgID>
                    <ErrorCode>0</ErrorCode>
                    <ErrorStatus><![CDATA[success]]></ErrorStatus>
                </List>
            </SubscribeMsgSentEvent>
        </xml>

        添加顾问 事件推送
        结果将推送给开发者
        参数 MsgType=event Event=guide_invite_result_even
        <guide_account></guide_account> <guide_openid></guide_openid> 仅返回请求值
        </invite_result>只返回 1
        示例
        <xml>
          <ToUserName><![CDATA[gh_95ad37df48fa]]></ToUserName>
          <FromUserName><![CDATA[ou4sAuBkvP7vnN3uzOPwN6MEGl1U]]></FromUserName>
          <CreateTime>1594346219</CreateTime>
          <MsgType><![CDATA[event]]></MsgType>
          <Event><![CDATA[guide_invite_result_event]]></Event>
          <GuideInviteEvent>
            <guide_account><![CDATA[ihaveacat]]></guide_account>
            <guide_openid></guide_openid>
            <invite_result>1</invite_result>
          </GuideInviteEvent>
        </xml>

        微信用户扫顾问二维码后会触发事件推送
        消息参数
        Object
        属性					类型	说明
        ToUserName				string	小程序的原始ID
        FromUserName			string	发送者的openid
        CreateTime				number	消息创建时间（整型）
        MsgType					string	固定 event
        Event					string	固定 guide_qrcode_scan_event
        qrcode_guide_account	string	顾问微信号
        qrcode_guide_openid		string	顾问openid,仅通过openid绑定的顾问有效
        openid					string	扫码微信用户openid
        action					number	扫码结果类型（整型）
        qrcode_info				string	生成二维码时填写的信息，开发者自行使用

        action 的合法值
        值	说明 
        1	二维码所属顾问失效	
        2	成功建立顾问绑定关系	
        3	顾问绑定关系已存在	
        4	微信用户已经被其他顾问绑定	
        消息数据包示例
        XML 格式
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>
          <FromUserName><![CDATA[fromUser]]></FromUserName>
          <CreateTime>1546924844</CreateTime>
          <MsgType><![CDATA[event]]></MsgType>
          <Event><![CDATA[guide_qrcode_scan_event]]></Event>
          <GuideScanEvent>
            <qrcode_guide_account>![CDATA[xxx]]</qrcode_guide_account>
            <qrcode_guide_openid>![CDATA[xxx]]</qrcode_guide_openid>
            <openid>![CDATA[xxx]]</openid>
            <action>11</action>
            <qrcode_info>![CDATA[xxx]]</qrcode_info>
          </GuideScanEvent>
        </xml>

        为顾问分配客户
        事件推送
        结果将推送给开发者
        参数 MsgType=event Event=add_guide_buyer_relation_event
        示例
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>
          <FromUserName><![CDATA[fromUser]]></FromUserName>
          <CreateTime>1546924844</CreateTime>
          <MsgType><![CDATA[event]]></MsgType>
          <Event><![CDATA[add_guide_buyer_relation_event]]></Event>
          <errcode>0</errcode>
          <errmsg><![CDATA[ok]]></errmsg>
          <guide_account><![CDATA[xxxxx]]></guide_account>
          <guide_openid><![CDATA[yyyyyyyyyy]]></guide_openid>
          <buyer_openid><![CDATA[zzzzzzzz]]></buyer_openid>
        </xml>

        资质认证成功（此时立即获得接口权限）
        推送XML数据包示例：
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>  
          <FromUserName><![CDATA[fromUser]]></FromUserName>  
          <CreateTime>1442401156</CreateTime>  
          <MsgType><![CDATA[event]]></MsgType>  
          <Event><![CDATA[qualification_verify_success]]></Event>  
          <ExpiredTime>1442401156</ExpiredTime> 
        </xml>
        参数说明
        参数			描述
        ToUserName		开发者 微信号
        FromUserName	发送方帐号（一个OpenID，此时发送方是系统帐号）
        CreateTime		消息创建时间 （整型），时间戳
        MsgType			消息类型，event
        Event			事件类型 qualification_verify_success
        ExpiredTime		有效期 (整型)，指的是时间戳，将于该时间戳认证过期

        资质认证失败
        推送XML数据包示例：
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>  
          <FromUserName><![CDATA[fromUser]]></FromUserName>  
          <CreateTime>1442401156</CreateTime>  
          <MsgType><![CDATA[event]]></MsgType>  
          <Event><![CDATA[qualification_verify_fail]]></Event>  
          <FailTime>1442401122</FailTime>  
          <FailReason><![CDATA[by time]]></FailReason> 
        </xml>
        参数说明
        参数			描述
        ToUserName		开发者 微信号
        FromUserName	发送方帐号（一个OpenID，此时发送方是系统帐号）
        CreateTime		消息创建时间 （整型），时间戳
        MsgType			消息类型，event
        Event			事件类型 qualification_verify_fail
        FailTime		失败发生时间 (整型)，时间戳
        FailReason		认证失败的原因

        名称认证成功（即命名成功）
        推送XML数据包示例：
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>  
          <FromUserName><![CDATA[fromUser]]></FromUserName>  
          <CreateTime>1442401093</CreateTime>  
          <MsgType><![CDATA[event]]></MsgType>  
          <Event><![CDATA[naming_verify_success]]></Event>  
          <ExpiredTime>1442401093</ExpiredTime> 
        </xml>
        参数说明
        参数			描述
        ToUserName		开发者 微信号
        FromUserName	发送方帐号（一个OpenID，此时发送方是系统帐号）
        CreateTime		消息创建时间 （整型），时间戳
        MsgType			消息类型，event
        Event			事件类型 naming_verify_success
        ExpiredTime		有效期 (整型)，指的是时间戳，将于该时间戳认证过期

        名称认证失败（这时虽然客户端不打勾，但仍有接口权限）
        推送XML数据包示例：
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>  
          <FromUserName><![CDATA[fromUser]]></FromUserName>  
          <CreateTime>1442401061</CreateTime>  
          <MsgType><![CDATA[event]]></MsgType>  
          <Event><![CDATA[naming_verify_fail]]></Event>  
          <FailTime>1442401061</FailTime>  
          <FailReason><![CDATA[by time]]></FailReason> 
        </xml>
        参数说明
        参数			描述
        ToUserName		开发者 微信号
        FromUserName	发送方帐号（一个OpenID，此时发送方是系统帐号）
        CreateTime		消息创建时间 （整型），时间戳
        MsgType			消息类型，event
        Event			事件类型 naming_verify_fail
        FailTime		失败发生时间 (整型)，时间戳
        FailReason		认证失败的原因

        年审通知
        推送XML数据包示例：
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>  
          <FromUserName><![CDATA[fromUser]]></FromUserName>  
          <CreateTime>1442401004</CreateTime>  
          <MsgType><![CDATA[event]]></MsgType>  
          <Event><![CDATA[annual_renew]]></Event>  
          <ExpiredTime>1442401004</ExpiredTime> 
        </xml>
        参数说明
        参数			描述
        ToUserName		开发者 微信号
        FromUserName	发送方帐号（一个OpenID，此时发送方是系统帐号）
        CreateTime		消息创建时间 （整型），时间戳
        MsgType			消息类型，event
        Event			事件类型 annual_renew，提醒公众号需要去年审了
        ExpiredTime		有效期 (整型)，指的是时间戳，将于该时间戳认证过期，需尽快年审

        认证过期失效通知审通知
        推送XML数据包示例：
        <xml>
          <ToUserName><![CDATA[toUser]]></ToUserName>  
          <FromUserName><![CDATA[fromUser]]></FromUserName>  
          <CreateTime>1442400900</CreateTime>  
          <MsgType><![CDATA[event]]></MsgType>  
          <Event><![CDATA[verify_expired]]></Event>  
          <ExpiredTime>1442400900</ExpiredTime> 
        </xml>
        参数说明
        参数			描述
        ToUserName		开发者 微信号
        FromUserName	发送方帐号（一个OpenID，此时发送方是系统帐号）
        CreateTime		消息创建时间 （整型），时间戳
        MsgType			消息类型，event
        Event			事件类型 verify_expired
        ExpiredTime		有效期 (整型)，指的是时间戳，表示已于该时间戳认证过期，需要重新发起微信认证

        2.卡券事件推送
        卡券通过审核、卡券被用户领取、卡券被用户删除、卡券被商户核销、从卡券进入公众号等情况均会触发事件推送，该事件将发送至开发者填写的URL**（ 登录公众平台进入【开发者中心设置】）**。 开发者可通过事件推送完成数据统计、用户身份识别等操作。
        微信服务器在五秒内收不到响应会断掉连接，并且重新发起请求，总共重试三次。关于重试的消息排重，推荐使用FromUserName + CreateTime 排重。假如服务器无法保证在五秒内处理并回复，可以直接回复空串，微信服务器不会对此作任何处理，并且不会发起重试。
        2.1 审核事件推送
        生成的卡券通过审核时，微信会把这个事件推送到开发者填写的URL。
        <xml>
           <ToUserName><![CDATA[toUser]]></ToUserName>
           <FromUserName><![CDATA[FromUser]]></FromUserName>
           <CreateTime>123456789</CreateTime>
           <MsgType><![CDATA[event]]></MsgType>
           <Event><![CDATA[card_pass_check]]></Event> //不通过为card_not_pass_check
           <CardId><![CDATA[cardid]]></CardId>
           <RefuseReason><![CDATA[非法代制]]></RefuseReason> 
        </xml>
        参数说明：
        参数			说明
        ToUserName		开发者微信号
        FromUserName	发送方帐号（一个OpenID）
        CreateTime		消息创建时间 （整型）
        MsgType			消息类型，event
        Event			事件类型，card_pass_check(卡券通过审核)、card_not_pass_check（卡券未通过审核）
        CardId			卡券ID
        RefuseReason	审核不通过原因

        2.2 领取事件推送
        用户在领取卡券时，微信会把这个事件推送到开发者填写的URL。 推送XML数据包示例：
        <xml>
           <ToUserName> <![CDATA[gh_fc0a06a20993]]> </ToUserName>
           <FromUserName> <![CDATA[oZI8Fj040-be6rlDohc6gkoPOQTQ]]> </FromUserName>
           <CreateTime>1472551036</CreateTime>
           <MsgType> <![CDATA[event]]> </MsgType>
           <Event> <![CDATA[user_get_card]]> </Event>
           <CardId> <![CDATA[pZI8Fjwsy5fVPRBeD78J4RmqVvBc]]> </CardId>
           <IsGiveByFriend>0</IsGiveByFriend>
           <UserCardCode> <![CDATA[226009850808]]> </UserCardCode>
           <FriendUserName> <![CDATA[]]> </FriendUserName>
           <OuterId>0</OuterId>
           <OldUserCardCode> <![CDATA[]]> </OldUserCardCode>
           <OuterStr> <![CDATA[12b]]> </OuterStr>
           <IsRestoreMemberCard>0</IsRestoreMemberCard>
           <IsRecommendByFriend>0</IsRecommendByFriend>
           <UnionId>o6_bmasdasdsad6_2sgVt7hMZOPfL</UnionId>
        </xml>
        参数说明：
        参数				说明
        ToUserName			开发者微信号。
        FromUserName		领券方帐号（一个OpenID）。
        CreateTime			消息创建时间 （整型）。
        MsgType				消息类型，event
        Event				事件类型，user_get_card(用户领取卡券)。
        CardId				卡券ID。
        IsGiveByFriend		是否为转赠领取，1代表是，0代表否。
        FriendUserName		当IsGiveByFriend为1时填入的字段，表示发起转赠用户的openid
        UserCardCode		code序列号。
        OldUserCardCode		为保证安全，微信会在转赠发生后变更该卡券的code号，该字段表示转赠前的code。
        OuterStr			领取场景值，用于领取渠道数据统计。可在生成二维码接口及添加Addcard接口中自定义该字段的字符串值。
        IsRestoreMemberCard	用户删除会员卡后可重新找回，当用户本次操作为找回时，该值为1，否则为0
        UnionId				领券用户的UnionId

        2.3转赠事件推送
        用户在转赠卡券时，微信会把这个事件推送到开发者填写的URL。 推送XML数据包示例：
        <xml>
          <ToUserName><![CDATA[gh_3fcea188bf78]]></ToUserName>  
          <FromUserName><![CDATA[obLatjjwDolFjRRd3doGIdwNqRXw]]></FromUserName>  
          <CreateTime>1474181868</CreateTime>  
          <MsgType><![CDATA[event]]></MsgType>  
          <Event><![CDATA[user_gifting_card]]></Event>  
          <CardId><![CDATA[pbLatjhU-3pik3d4PsbVzvBxZvJc]]></CardId>  
          <UserCardCode><![CDATA[297466945104]]></UserCardCode>  
          <IsReturnBack>0</IsReturnBack>  
          <FriendUserName><![CDATA[obLatjlNerkb62HtSdQUx66C4NTU]]></FriendUserName>  
          <IsChatRoom>0</IsChatRoom> 
        </xml>
        参数说明：
        参数			说明
        ToUserName		开发者微信号。
        FromUserName	领券方帐号（一个OpenID）。
        CreateTime		消息创建时间 （整型）。
        MsgType			消息类型，event
        Event			事件类型，user_gifting_card(用户转赠卡券)。
        CardId			卡券ID。
        FriendUserName	接收卡券用户的openid
        UserCardCode	code序列号。
        IsReturnBack	是否转赠退回，0代表不是，1代表是。
        IsChatRoom		是否是群转赠

        2.4 删除事件推送
        用户在删除卡券时，微信会把这个事件推送到开发者填写的URL。 推送XML数据包示例：
        <xml>
         <ToUserName><![CDATA[toUser]]></ToUserName>
         <FromUserName><![CDATA[FromUser]]></FromUserName>
         <CreateTime>123456789</CreateTime>
         <MsgType><![CDATA[event]]></MsgType>
         <Event><![CDATA[user_del_card]]></Event>
         <CardId><![CDATA[cardid]]></CardId>
         <UserCardCode><![CDATA[12312312]]></UserCardCode>
        </xml>
        参数说明：
        参数			说明
        ToUserName		开发者微信号。
        FromUserName	发送方帐号（一个OpenID）
        CreateTime		消息创建时间 （整型）。
        MsgType			消息类型，event
        Event			事件类型，user_del_card(用户删除卡券)
        CardId			卡券ID。
        UserCardCode	code序列号。自定义code及非自定义code的卡券被领取后都支持事件推送。

        2.5 核销事件推送
        卡券被核销时，微信会把这个事件推送到开发者填写的URL。 推送XML数据包示例：
        <xml>
	        <ToUserName> <![CDATA[gh_fc0a06a20993]]> </ToUserName>
            <FromUserName> <![CDATA[oZI8Fj040-be6rlDohc6gkoPOQTQ]]> </FromUserName>
            <CreateTime>1472549042</CreateTime>
            <MsgType> <![CDATA[event]]> </MsgType>
            <Event> <![CDATA[user_consume_card]]> </Event>
            <CardId> <![CDATA[pZI8Fj8y-E8hpvho2d1ZvpGwQBvA]]> </CardId>
            <UserCardCode> <![CDATA[452998530302]]> </UserCardCode>
            <ConsumeSource> <![CDATA[FROM_API]]> </ConsumeSource>
            <LocationName> <![CDATA[]]> </LocationName>
            <StaffOpenId> <![CDATA[oZ********nJ3bPJu_Rtjkw4c]]> </StaffOpenId>
            <VerifyCode> <![CDATA[]]> </VerifyCode>
            <RemarkAmount> <![CDATA[]]> </RemarkAmount>
            <OuterStr> <![CDATA[xxxxx]]> </OuterStr> 
        </xml>
        参数			说明
        ToUserName		开发者微信号。
        FromUserName	发送方帐号（一个OpenID）。
        CreateTime		消息创建时间 （整型）。
        MsgType			消息类型，event。
        Event			事件类型，user_consume_card(核销事件)
        CardId			卡券ID。
        UserCardCode	卡券Code码。
        ConsumeSource	核销来源。支持开发者统计API核销（FROM_API）、公众平台核销（FROM_MP）、卡券商户助手核销（FROM_MOBILE_HELPER）（核销员微信号）
        LocationName	门店名称，当前卡券核销的门店名称（只有通过自助核销和买单核销时才会出现该字段）
        StaffOpenId		核销该卡券核销员的openid（只有通过卡券商户助手核销时才会出现）
        VerifyCode		自助核销时，用户输入的验证码
        RemarkAmount	自助核销 时 ，用户输入的备注金额
        OuterStr		开发者发起核销时传入的自定义参数，用于进行核销渠道统计

        2.6 买单事件推送
        微信买单完成时，微信会把这个事件推送到开发者填写的URL。 推送XML数据包示例：
        <xml>
            <ToUserName><![CDATA[gh_e2243xxxxxxx]]></ToUserName>
            <FromUserName><![CDATA[oo2VNuOUuZGMxxxxxxxx]]></FromUserName>
            <CreateTime>1442390947</CreateTime>
            <MsgType><![CDATA[event]]></MsgType>
            <Event><![CDATA[user_pay_from_pay_cell]]></Event>
            <CardId><![CDATA[po2VNuCuRo-8sxxxxxxxxxxx]]></CardId>
            <UserCardCode><![CDATA[38050000000]]></UserCardCode>
            <TransId><![CDATA[10022403432015000000000]]></TransId>
            <LocationId>291710000</LocationId>
            <Fee><![CDATA[10000]]></Fee>
            <OriginalFee><![CDATA[10000]]> </OriginalFee> 
        </xml>
        参数			说明
        ToUserName		开发者微信号。
        FromUserName	发送方帐号（一个OpenID）。
        CreateTime		消息创建时间 （整型）。
        MsgType			消息类型，event。
        Event			事件类型，User_pay_from_pay_cell(微信买单事件)
        CardId			卡券ID。
        UserCardCode	卡券Code码。
        TransId			微信支付交易订单号（只有使用买单功能核销的卡券才会出现）
        LocationId		门店ID，当前卡券核销的门店ID（只有通过卡券商户助手和买单核销时才会出现）
        Fee				实付金额，单位为分
        OriginalFee		应付金额，单位为分

        2.7 进入会员卡事件推送
        用户在进入会员卡时，微信会把这个事件推送到开发者填写的URL。
        需要开发者在首页时填入need_push_on_view 字段并设置为true。开发者须综合考虑领卡人数和服务器压力，决定是否接收该事件。
        推送XML数据包示例：
        <xml>
            <ToUserName> <![CDATA[gh_fcxxxx6a20993]]> </ToUserName>
            <FromUserName> <![CDATA[oZI8Fj040-xxxxx6gkoPOQTQ]]> </FromUserName>
            <CreateTime>1467811138</CreateTime>
            <MsgType> <![CDATA[event]]> </MsgType>
            <Event> <![CDATA[user_view_card]]> </Event>
            <CardId> <![CDATA[pZI8Fj2ezBbxxxxxT2UbiiWLb7Bg]]> </CardId>
            <UserCardCode> <![CDATA[4xxxxxxxx8558]]> </UserCardCode>
            <OuterStr> <![CDATA[12b]]> </OuterStr> 
        </xml>
        参数说明：
        参数			说明
        ToUserName		开发者微信号。
        FromUserName	发送方帐号（一个OpenID）。
        CreateTime		消息创建时间 （整型）。
        MsgType			消息类型，event。
        Event			事件类型，user_view_card(用户点击会员卡)
        CardId			卡券ID。
        UserCardCode	商户自定义code值。非自定code推送为空串。
        OuterStr		商户自定义二维码渠道参数，用于标识本次扫码打开会员卡来源来自于某个渠道值的二维码

        2.8 从卡券进入公众号会话事件推送
        用户在卡券里点击查看公众号进入会话时（需要用户已经关注公众号），微信会把这个事件推送到开发者填写的URL。开发者可识别从卡券进入公众号的用户身份。 推送XML数据包示例：
        <xml>
           <ToUserName><![CDATA[toUser]]></ToUserName>
           <FromUserName><![CDATA[FromUser]]></FromUserName>
           <CreateTime>123456789</CreateTime>
           <MsgType><![CDATA[event]]></MsgType>
           <Event><![CDATA[user_enter_session_from_card]]></Event>
           <CardId><![CDATA[cardid]]></CardId>
           <UserCardCode><![CDATA[12312312]]></UserCardCode> 
        </xml>
        参数说明：
        参数			说明
        ToUserName		开发者微信号。
        FromUserName	发送方帐号（一个OpenID）
        CreateTime		消息创建时间 （整型）。
        MsgType			消息类型，event
        Event			事件类型，user_enter_session_from_card(用户从卡券进入公众号会话)
        CardId			卡券ID。
        UserCardCode	Code码。

        2.9 会员卡内容更新事件
        当用户的会员卡积分余额发生变动时，微信会推送事件告知开发者。 推送XML数据包示例：
        <xml>
          <ToUserName><![CDATA[gh_9e1765b5568e]]></ToUserName>
          <FromUserName><![CDATA[ojZ8YtyVyr30HheH3CM73y7h4jJE]]></FromUserName>
          <CreateTime>1445507140</CreateTime>
          <MsgType><![CDATA[event]]></MsgType>
          <Event><![CDATA[update_member_card]]></Event>
          <CardId><![CDATA[pjZ8Ytx-nwvpCRyQneH3Ncmh6N94]]></CardId>
          <UserCardCode><![CDATA[485027611252]]></UserCardCode>
          <ModifyBonus>3</ModifyBonus>
          <ModifyBalance>0</ModifyBalance> 
        </xml>
        参数说明：
        参数			说明
        ToUserName		开发者微信号。
        FromUserName	发送方帐号（一个OpenID）
        CreateTime		消息创建时间 （整型）。
        MsgType			消息类型，event
        Event			事件类型，update_member_card(会员卡内容更新）
        CardId			卡券ID。
        UserCardCode	Code码。
        ModifyBonus		变动的积分值。
        ModifyBalance	变动的余额值。

        2.10 库存报警事件
        当某个card_id的初始库存数大于200且当前库存小于等于100时，用户尝试领券会触发发送事件给商户，事件每隔12h发送一次。
        <xml>
           <ToUserName><![CDATA[gh_2d62d*****0]]></ToUserName>
            <FromUserName><![CDATA[oa3LFuBvWb7*********]]></FromUserName>
            <CreateTime>1443838506</CreateTime>
            <MsgType><![CDATA[event]]></MsgType>
            <Event><![CDATA[card_sku_remind]]></Event>
            <CardId><![CDATA[pa3LFuAh2P65**********]]></CardId>
            <Detail><![CDATA[the card's quantity is equal to 0]]></Detail>
        </xml>
        参数说明：
        参数			说明
        ToUserName		开发者微信号
        FromUserName	发送方，微信
        CreateTime		消息创建时间 （整型）
        MsgType			消息类型，event
        Event			事件类型，card_sku_remind库存报警
        CardId			卡券ID
        Detail			报警详细信息

        2.11 券点流水详情事件
        当商户朋友的券券点发生变动时，微信服务器会推送消息给商户服务器。
        <xml>
           <ToUserName><![CDATA[gh_7223c83d4be5]]></ToUserName>
            <FromUserName><![CDATA[ob5E7s-HoN9tslQY3-0I4qmgluHk]]></FromUserName>
            <CreateTime>1453295737</CreateTime>
            <MsgType><![CDATA[event]]></MsgType>
            <Event><![CDATA[card_pay_order]]></Event>
            <OrderId><![CDATA[404091456]]></OrderId>
            <Status><![CDATA[ORDER_STATUS_FINANCE_SUCC]]></Status>
            <CreateOrderTime>1453295737</CreateOrderTime>
            <PayFinishTime>0</PayFinishTime>
            <Desc><![CDATA[]]></Desc>
            <FreeCoinCount><![CDATA[200]]></FreeCoinCount>
            <PayCoinCount><![CDATA[0]]></PayCoinCount>
            <RefundFreeCoinCount><![CDATA[0]]></RefundFreeCoinCount>
            <RefundPayCoinCount><![CDATA[0]]></RefundPayCoinCount>
            <OrderType><![CDATA[ORDER_TYPE_SYS_ADD]]></OrderType>
            <Memo><![CDATA[开通账户奖励]]></Memo>
            <ReceiptInfo><![CDATA[]]></ReceiptInfo>
        </xml>
        参数说明：
        参数				说明
        ToUserName			开发者微信号
        FromUserName		发送方，微信
        CreateTime			消息创建时间 （整型）
        MsgType				消息类型，event
        Event				事件类型，card_pay_order券点流水详情事件
        OrderId				本次推送对应的订单号
        Status				本次订单号的状态,ORDER_STATUS_WAITING 等待支付 ORDER_STATUS_SUCC 支付成功 ORDER_STATUS_FINANCE_SUCC 加代币成功 ORDER_STATUS_QUANTITY_SUCC 加库存成功 ORDER_STATUS_HAS_REFUND 已退币 ORDER_STATUS_REFUND_WAITING 等待退币确认 ORDER_STATUS_ROLLBACK 已回退,系统失败 ORDER_STATUS_HAS_RECEIPT 已开发票
        CreateOrderTime		购买券点时，支付二维码的生成时间
        PayFinishTime		购买券点时，实际支付成功的时间
        Desc				支付方式，一般为微信支付充值
        FreeCoinCount		剩余免费券点数量
        PayCoinCount		剩余付费券点数量
        RefundFreeCoinCount	本次变动的免费券点数量
        RefundPayCoinCount	本次变动的付费券点数量
        OrderType			所要拉取的订单类型 ORDER_TYPE_SYS_ADD 平台赠送券点 ORDER_TYPE_WXPAY 充值券点 ORDER_TYPE_REFUND 库存未使用回退券点 ORDER_TYPE_REDUCE 券点兑换库存 ORDER_TYPE_SYS_REDUCE 平台扣减
        Memo				系统备注，说明此次变动的缘由，如开通账户奖励、门店奖励、核销奖励以及充值、扣减。
        ReceiptInfo			所开发票的详情


        2.12 会员卡激活事件推送
        当用户通过一键激活的方式提交信息并点击激活或者用户修改会员卡信息后，商户会收到用户激活的事件推送
        <xml>
           <ToUserName> <![CDATA[gh_3fcea188bf78]]></ToUserName>
            <FromUserName><![CDATA[obLatjlaNQKb8FqOvt1M1x1lIBFE]]></FromUserName>
            <CreateTime>1432668700</CreateTime>
            <MsgType><![CDATA[event]]></MsgType>
            <Event><![CDATA[submit_membercard_user_info]]></Event>
            <CardId><![CDATA[pbLatjtZ7v1BG_ZnTjbW85GYc_E8]]></CardId>
            <UserCardCode><![CDATA[018255396048]]></UserCardCode> 
        </xml>
        参数说明
        参数			说明
        ToUserName		开发者微信号
        FromUserName	发送方帐号（一个OpenID）
        CreateTime		消息创建时间 （整型）
        MsgType			消息类型，event
        CardId			卡券ID
        UserCardCode	卡券Code码

        10.礼品卡相关事件
        特别说明
        礼品卡作为金钱交易事务，商家可能自身有对账等需求，所以对商家服务器CallBack保证较高稳定性。
        在商家未接受CallBack情况下，在24小时内，最大限度推送，最多30次。
        与普通CallBack事件不同，商家在接收到CallBack之后，在Http的协议里，除了在Header中要返回200，还需要在Content中返回：
        <xml\>ok</xml\>
        以告诉微信平台，商家真正接收到了CallBack并处理成功
        否则微信平台将继续重试推送。
        10.1、用户购买礼品卡付款成功CallBack
        协议
        <xml>
        <ToUserName><![CDATA[gh_3fcea188bf78]]></ToUserName>
        <FromUserName><![CDATA[obLatjgoYejavUtHsWwrX-2GtFJE]]></FromUserName>
        <CreateTime>1472631550</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[giftcard_pay_done]]></Event>
        <PageId><![CDATA[OQK0R3MaFnCm74Phw5hwFJlz5sn+jy1zzM2amDidDbU=]]></PageId>
        <OrderId><![CDATA[Z2y2rY74ksZX1ceuGA]]></OrderId>
        </xml>
        请求参数说明：
        参数			说明
        ToUserName		接收该事件的公众号原始id
        FromUserName	事件发起人，该事件中标识下单购买人的openid
        CreateTime		事件创建时间
        MsgType			消息类型
        Event			事件类型，此处为giftcard_pay_done标识订单完成事件
        PageId			货架的id
        OrderId			订单号

        10.2、用户购买后赠送CallBack
        协议
        <xml>
        <ToUserName><![CDATA[gh_3fcea188bf78]]></ToUserName>
        <FromUserName><![CDATA[obLatjgoYejavUtHsWwrX-2GtFJE]]></FromUserName>
        <CreateTime>1472631550</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[giftcard_send_to_friend]]></Event>
        <PageId><![CDATA[OQK0R3MaFnCm74Phw5hwFJlz5sn+jy1zzM2amDidDbU=]]></PageId>
        <OrderId><![CDATA[Z2y2rY74ksZX1ceuGA]]></OrderId>
        <IsChatRoom>true</IsChatRoom>
        <IsReturnBack><![CDATA[true]]></IsReturnBack>
        </xml>
        请求参数说明：
        参数			说明
        ToUserName		接收该事件的公众号原始id
        FromUserName	事件发起人，该事件中标识下单购买人的openid
        CreateTime		事件创建时间
        MsgType			消息类型
        Event			事件类型，标识礼品卡已被赠送
        PageId			货架的id
        OrderId			订单号
        IsChatRoom		礼品卡是否发送至群，true为是
        IsReturnBack	标识礼品卡是否因超过24小时未被领取，退回卡包。True时表明超时退回卡包。

        10.3、用户领取礼品卡成功CallBack
        协议
        <xml>
        <ToUserName><![CDATA[gh_3fcea188bf78]]></ToUserName>
        <FromUserName><![CDATA[obLatjgoYejavUtHsWwrX-2GtFJE]]></FromUserName>
        <CreateTime>1472631800</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[giftcard_user_accept]]></Event>
        <PageId><![CDATA[OQK0R3MaFnCm74Phw5hwFJlz5sn+jy1zzM2amDidDbU=]]></PageId>
        <OrderId><![CDATA[Z2y2rY74ksZX1ceuGA]]></OrderId>
        <IsChatRoom>true</IsChatRoom>
        </xml>
        请求参数说明：
        参数			说明
        ToUserName		接收该事件的公众号原始id
        FromUserName	事件发起人，该事件中领取人的openid
        CreateTime		事件创建时间
        MsgType		消息类型
        Event		事件类型，此处为giftcard_user_accept标识订单完成事件
        PageId		货架的id
        OrderId		订单号
        IsChatRoom	礼品卡是否发送至群，true为是
        10.4、赠送24小时对方未领取退回后的事件
        若对方24小时未领取，则礼品卡会自动放入用户卡包，则这张卡再次发生转赠和领取时，推送的事件变为普通的转赠-领取事件。

        领取
        协议
        <xml>
        <ToUserName> <![CDATA[gh_fc0a06a20993]]> </ToUserName>
        <FromUserName> <![CDATA[oZI8Fj040-be6rlDohc6gkoPOQTQ]]> </FromUserName>
        <CreateTime>1472551036</CreateTime>
        <MsgType> <![CDATA[event]]> </MsgType>
        <Event> <![CDATA[user_get_card]]> </Event>
        <CardId> <![CDATA[pZI8Fjwsy5fVPRBeD78J4RmqVvBc]]> </CardId>
        <IsGiveByFriend>0</IsGiveByFriend>
        <UserCardCode> <![CDATA[226009850808]]> </UserCardCode>
        <FriendUserName> <![CDATA[]]> </FriendUserName>
        <OldUserCardCode> <![CDATA[]]> </OldUserCardCode>
        </xml>
        请求参数说明：
        参数			说明
        ToUserName		接收该事件的公众号原始id
        FromUserName	事件发起人，该事件中领取人的openid
        CreateTime		事件创建时间
        MsgType			消息类型
        Event			事件类型，此处为user_get_card标识普通卡券领取
        CardId			Cardid
        IsGiveByFriend	是否来自好友转赠
        UserCardCode	用户领取到的code
        FriendUserName	发起方openid
        OldUserCardCode	旧的code，若为非自定义code，转赠时微信会变更用户的code，非自定义code的商户不必理会该规则。

        转赠
        协议
        <xml>
        <ToUserName><![CDATA[gh_3fcea188bf78]]></ToUserName>
        <FromUserName><![CDATA[obLatjjwDolFjRRd3doGIdwNqRXw]]></FromUserName>
        <CreateTime>1474181868</CreateTime>
        <MsgType><![CDATA[event]]></MsgType>
        <Event><![CDATA[user_gifting_card]]></Event>
        <CardId><![CDATA[pbLatjhU-3pik3d4PsbVzvBxZvJc]]></CardId>
        <UserCardCode><![CDATA[297466945104]]></UserCardCode>
        <IsReturnBack>0</IsReturnBack>
        <FriendUserName><![CDATA[obLatjlNerkb62HtSdQUx66C4NTU]]></FriendUserName>
        <IsChatRoom>0</IsChatRoom>
        </xml>
        请求参数说明：
        参数			说明
        ToUserName		接收该事件的公众号原始id
        FromUserName	事件发起人，该事件中领取人的openid
        CreateTime		事件创建时间
        MsgType			消息类型
        Event			事件类型，此处为user_get_card标识普通卡券领取
        CardId			Cardid
        IsReturnBack	是否是转赠退回，1代表是转赠退回，0代表是发起赠送
        UserCardCode	用户领取到的code
        FriendUserName	发起方openid
        IsChatRoom		是否发送到群

        12.2.2.4接收开票事件
        接口描述
        用户授权完成后，商户会收到授权完成的事件，并请求开票平台进行开票。
        关于事件推送请参考：
        http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025274&token=&lang=zh_CN
        请求参数
        数据格式：xml
        参数			类型	描述
        ToUserName		String	公众号标识
        FromUserName	String	用户openid
        CreateTime		Int		事件时间
        MsgType			String	固定为event
        Event			String	固定为user_authorize_invoice
        SuccOrderId		String	授权成功的订单号
        FailOrderId		String	授权失败的订单号
        AppId			String	用于接收事件推送的公众号的AppId
        Source			String	授权来源，web表示来自微信内H5，app标识来自app
        示例
        <xml> 
          <ToUserName> <![CDATA[gh_fc0a06a20993]]> </ToUserName>  
          <FromUserName> <![CDATA[oZI8Fj040-be6rlDohc6gkoPOQTQ]]> </FromUserName>  
          <CreateTime>1475134700</CreateTime>  
          <MsgType> <![CDATA[event]]> </MsgType>  
          <Event> <![CDATA[user_authorize_invoice]]> </Event>  
          <SuccOrderId> <![CDATA[1202933957956]]> </SuccOrderId>  
          <FailOrderId> <![CDATA[]]> </FailOrderId>
          <AppId> <![CDATA[]]> </AppId>
          <Source> <![CDATA[]]> </Source>
        </xml>

        微信卡券 第三方模式
        1.2 子商户审核事件推送
        开发者所代理的子商户审核通过后，会收到微信服务器发送的事件推送。
        <xml> 
          <ToUserName><![CDATA[toUser]]></ToUserName>  
          <FromUserName><![CDATA[FromUser]]></FromUserName>  
          <CreateTime>123456789</CreateTime>  
          <MsgType><![CDATA[event]]></MsgType>  
          <Event><![CDATA[card_merchant_check_result]]></Event>  
          <MerchantId>0</MerchantId>  
          <IsPass>1</IsPass>  
          <Reason><![CDATA[reason]]></Reason> 
        </xml>
        字段说明
        参数	        说明
        ToUserName	    开发者微信号。
        FromUserName	发送方帐号（一个OpenID）。
        CreateTime	    消息创建时间 （整型）。
        MsgType	        消息类型，event。
        Event	        事件类型，card_merchant_check_result(子商户审核事件)
        MerchantId	    子商户ID。
        IsPass	        是否通过，为1时审核通过。
        Reason	        驳回的原因 




    */
}
